package ar.edu.unrn.lia.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.inject.Named;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import ar.edu.unrn.lia.dao.MovimientoDAO;
import ar.edu.unrn.lia.generic.GenericDaoJpaImpl;
import ar.edu.unrn.lia.model.Movimiento;
import ar.edu.unrn.lia.model.Movimiento.TipoFactura;
import ar.edu.unrn.lia.model.Movimiento.TipoMovimiento;

@Named("movimientoDAO")
public class MovimientoDAOImpl extends GenericDaoJpaImpl<Movimiento, Long>
		implements MovimientoDAO, Serializable {



	/**
	 * 
	 */
	private static final long serialVersionUID = 9114876638768617594L;

	public Predicate[] getSearchPredicates(Root<Movimiento> root,
			Map<String, String> filters) {

		CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
		List<Predicate> predicatesList = new ArrayList<Predicate>();
		root.alias("entity");

		filtroEqual("asiento", predicatesList, builder, root, filters);
		filtroLike("concepto", predicatesList, builder, root, filters);
		filtroLike("factura", predicatesList, builder, root, filters);
		filtroLike(filters.get("cuenta.nombre"), predicatesList, builder, root, "cuenta","nombre");

				
		String tipoMovimiento = filters.get("tipoMovimiento");
		if (tipoMovimiento != null && !"".equals(tipoMovimiento)) {
			for (TipoMovimiento av : TipoMovimiento.values()) {
				if (av.toString().equals(tipoMovimiento))
				{
					predicatesList.add(builder.equal(root.get("tipoMovimiento"),av));
				}
			}	
		}

		String tipoFactura = filters.get("tipoFactura");
		if (tipoFactura != null && !"".equals(tipoFactura)) {
			for (TipoFactura av : TipoFactura.values()) {
				if (av.toString().equals(tipoFactura))
				{
					predicatesList.add(builder.equal(root.get("tipoFactura"),av));
				}
			}	
		}
		
		
		return predicatesList.toArray(new Predicate[predicatesList.size()]);
	}
	
	public int ultimoAsiento() {
		try {
			CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
			CriteriaQuery<Integer> criteria = builder
					.createQuery(Integer.class);
			Root<Movimiento> cuentaRoot = criteria.from(Movimiento.class);
			criteria.select(builder.max(cuentaRoot.<Integer> get("asiento")));
			
			return this.entityManager.createQuery(criteria).getSingleResult();
		} catch (Exception re) {
			return 0;
		}

	}

}